home *** CD-ROM | disk | FTP | other *** search
- PAGE 60,132
- TITLE Locate DOS master environment address
-
- .MODEL small
-
- INCLUDE dos.cpy ;ms-dos equates
- INCLUDE asmequ.cpy ;std asm equates
-
- .CODE
-
- PUBLIC FindEnv
-
- EnvPtr EQU 2CH ; Offset in PSP
- CommandPtr EQU 2EH ; entry point into first Command.Com
- DosSegPtr EQU CommandPtr * 4 + 2
- EnvLen EQU [BP+6] ;passed parms
- EnvSeg EQU [BP+4]
-
- ;----------------------------------------------------------;
- ; This routine finds the 'master' Environment block for ;
- ; DOS. If it can't find it, it passes back the local ;
- ; Environment block. ;
- ; ;
- ; Calling sequence; ;
- ; ;
- ; MOV AX,OFFSET EnvLen ;returned length ;
- ; PUSH AX ;
- ; MOV AX,OFFSET EnvSeg ;returned seg address ;
- ; PUSH AX ;
- ; CALL FindEnv ;
- ; JC A800_NoEnv ;check for errors ;
- ; ;
- ;----------------------------------------------------------;
- FindEnv PROC
- PUSH BP ;set up linkage
- MOV BP,SP
- PUSH AX ;save registers
- PUSH SI
-
- XOR SI,SI ;point to low core
- MOV ES,SI ; with ES
- MOV SI,WORD PTR ES:[DosSegPtr] ;command.com interupt
- MOV AX,SI ;pass to VerifyBlock
- CALL VerifyBlock
- JNZ GotBlock ;got block (our PSP)
-
- MOV AX,ES:[EnvPtr+10h] ; get COMMAND's environment ptr
- OR AX,AX ; jump if COMMAND has a
- JNZ MaybeGoodBlock ; subsidiary environment
-
- MOV AX,SI ; If no subsidiary, just use
- ADD AX,CX ; the allocation block
- INC AX ; immediately after COMMAND
-
- MaybeGoodBlock: CALL VerifyBlock ; verify that it's good
-
- GotBlock:
- SHL CX,1 ; multiply by 16 to get
- SHL CX,1 ; length in bytes
- SHL CX,1
- SHL CX,1
- MOV DI,EnvLen ;pass back parms
- MOV [DI],CX
- MOV DI,EnvSeg
- MOV [DI],AX
-
- POP SI
- POP AX
- POP BP
-
- RET 2*2
-
- FindEnv ENDP
-
- ; VerifyBlock tries to insure that we're pointing to a valid DOS
- ; allocation block. If not, returns the current process's environment
- ; block.
-
-
- VerifyBlock PROC
- DEC AX ; get block header into ES
- MOV ES,AX
- INC AX
-
- CMP BYTE PTR ES:[0],04Dh ; make sure signature is valid
- JNZ UseCurrent
- CMP WORD PTR ES:[1],si ; make sure owner is valid
- JNZ UseCurrent
- MOV CX, WORD PTR ES:[3] ; retrieve the length
- RET
-
- UseCurrent: MOV AX,WORD PTR DS:[EnvPtr] ; get current process's env
- XOR CX,CX ; zero length
- RET
-
- VerifyBlock ENDP
-
- END